package top.iflyoung.cim.common.facade;

import top.iflyoung.cim.common.enums.StatusEnum;
import top.iflyoung.cim.common.pojo.CIMUserInfo;
import top.iflyoung.cim.common.pojo.RouteInfo;
import top.iflyoung.cim.common.req.GroupMessageVo;
import top.iflyoung.cim.common.req.P2PMessageVo;

import java.util.List;
import java.util.Set;

/**
 * @author liguiyang
 * @description 使用门面模式封装类型
 * @sine 1.8
 * @date 2021/9/417:14
 **/
public interface BaseChatFacade {
    /**
     * 注册
     *
     * @param username
     * @return
     */
    CIMUserInfo register(String username);

    /**
     * 注册
     *
     * @param userInfo
     * @return
     */
    CIMUserInfo register(CIMUserInfo userInfo);

    /**
     * 登录
     *
     * @param userInfo
     * @return
     */
    StatusEnum login(CIMUserInfo userInfo);

    /**
     * 下线
     *
     * @param userInfo
     * @return
     */
    boolean offline(CIMUserInfo userInfo);

    /**
     * 保存路由信息
     *
     * @param routeInfo
     * @return
     */
    boolean saveChatRouteInfo(CIMUserInfo userInfo, RouteInfo routeInfo);

    /**
     * 获取组内成员
     *
     * @param groupId
     * @return
     */
    Set<String> getMembersByGroupId(Long groupId);

    /**
     * 获取用户连接的服务器信息
     *
     * @param userId
     * @return
     */
    RouteInfo getUserRouteInfo(Long userId);

    /**
     * 获取用户信息
     *
     * @param userId
     * @return
     */
    CIMUserInfo getUserInfo(Long userId);

    /**
     * 获取在线用户的集合
     *
     * @return
     */
    Set<String> getOnlineUserIds();

    /**
     * 保存和检查用户登录情况
     *
     * @param userId userId 用户唯一 ID
     * @return true 为可以登录 false 为已经登录
     * @throws Exception
     */
    boolean saveAndCheckUserLoginStatus(Long userId);

    /**
     * 点对点信息
     *
     * @param messageVo
     * @return
     */
    boolean saveP2PMessage(P2PMessageVo messageVo);

    /**
     * 保存分组消息
     *
     * @param messageVo
     * @return
     */
    boolean saveGroupMessage(GroupMessageVo messageVo);

    /**
     * 批量保存组信息
     *
     * @param messages
     * @return
     */
    boolean saveGroupMessages(List<GroupMessageVo> messages);

    /**
     * 批量保存点对点信息
     *
     * @param messages
     * @return
     */
    boolean saveP2PMessages(List<P2PMessageVo> messages);

}
